package com.zjj.learn.designmodel.work.template;

public class TemplateTest {


    public static void main(String[] args) {
        //准备泡花茶
        MakeFlowerTea flowerTea = new MakeFlowerTea();
        flowerTea.make();
        System.out.println("=================");
        //准备泡绿茶
        MakeGreenTea greenTea = new MakeGreenTea();
        greenTea.make();
    }

    /**
     * 模板方法模式：行为型模式
     * 当执行某个操作的步骤基本上是固定的是，可以使用模板方法模式。
     * 模板方法模式定义了一个算法框架，将一系列具体的操作交给子类中去实现。可以在不改变模板框架算法的情况下，灵活的扩展改变每一步的具体实现。
     * 模板方法模式主要包括三个方面：
     *    1、抽象类：负责定义算法框架和模板方法的实现
     *       {@link com.zjj.learn.designmodel.work.template.MakeTea}
     *    2、具体子类：负责首相类中各个抽象方法的具体的实现
     *       {@link com.zjj.learn.designmodel.work.template.MakeGreenTea}
     *       {@link com.zjj.learn.designmodel.work.template.MakeFlowerTea}
     *    3、模板方法：执行算法方法的顺序
     *       {@link com.zjj.learn.designmodel.work.template.MakeTea#make()}
     *
     * 举例：当我们在泡茶时，泡茶的顺序基本上都是一致的，如：烧水、拿茶叶、倒茶、等待、品茶、洗锅。
     *      可以看出，除了拿茶叶究竟是红茶还是绿茶或者是果茶不一样，其他的步骤全部相同，这时就可以使用模板方法模式了。
     * 具体的实现见：{@link com.zjj.learn.designmodel.work.template}
     *
     *    总之，模板方法模式适用于当算法的基本骨架已经确定，
     * 但某些特定步骤的实现可能会在子类中发生变化的场景，它能通过抽象出模板方法来封装算法过程，
     * 并通过抽象方法延迟到子类中实现特定步骤，从而提高代码的重用性和扩展性。
     **/
}
